package cn.jjxx.modules.activiti.service;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.CustomProperty;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;

import cn.jjxx.core.model.AjaxJson;
import cn.jjxx.modules.activiti.exception.RepositoryException;
import cn.jjxx.modules.activiti.exception.TaskException;
import cn.jjxx.modules.activiti.workflow.AssigneeInfo;
import cn.jjxx.modules.activiti.workflow.BillBean;
import cn.jjxx.modules.activiti.workflow.OperateBean;

import cn.jjxx.modules.activiti.workflow.history.HistoryTaskComment;

public interface IFlowService {

	/**
	 * @Description: 部署流程 .<br>
	 * @param file zip格式的文件.<br>
	 * @param filename 部署流程的名称.<br>
	 * @return boolean 返回是否部署成功.<br> 
	 * @author 郑成功 .<br>
	 * @throws RepositoryException 
	 * @date 2017-9-19 下午3:24:23.<br>
	 */
	boolean saveNewDeployeFile(File file, String filename) throws RepositoryException;
	
	/**
	 * @Description: 部署流程.<br>
	 * @param in 通过输入流的方式 .<br>
	 * @param filename 部署流程的名称 .<br>
	 * @return boolean .<br> 
	 * @author 郑成功 .<br>
	 * @throws RepositoryException 
	 * @date 2017-9-19 下午3:25:14.<br>
	 */
	boolean saveNewDeployInputStream(InputStream in,String filename) throws RepositoryException;
	
	/**
	 * @Description: 提交流程，返回是否提交成功 .<br>
	 * @param billBean 单据的相关信息.<br>
	 * @param assignees 处理人信息.<br>
	 * @param isAutoSubmit 是否自动处理下一步审批（相同的人） .<br>
	 * @param billInfo 单据信息，用来走流程条件的信息.<br>
	 * @return boolean 是否提交成功 .<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-21 上午9:22:01.<br>
	 */
	@Deprecated
	boolean submitFlow(BillBean billBean, AssigneeInfo assignees, boolean isAutoSubmit, Map<String,Object> billInfo) throws TaskException;
	
	/**
	 * @Description: 提交流程 .<br>
	 * @param billBean 单据实体类.<br>
	 * @param isAutoSubmit 是否自动提交.<br>
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2018-7-23 下午4:31:14.<br>
	 */
	boolean submitFlow(BillBean billBean,boolean isAutoSubmit) throws TaskException;
	
	/**
	 * @Description: 审批流程,判断是否审批成功 .<br>
	 * @param taskId 当前任务Id.<br>
	 * @param operate 处理人(当前登录人或其他处理人信息).<br>
	 * @param assignees 处理人信息.<br>
	 * @param isAutoHandle 是否自动处理下一步审批（相同的人） .<br>
	 * @param billInfo 单据信息，用来走流程条件的信息.<br>
	 * @return boolean .<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-21 上午9:30:00.<br>
	 */
	boolean completeTask(String taskId, OperateBean operate, AssigneeInfo assignees, boolean isAutoHandle, Map<String,Object> billInfo) throws TaskException;
	
	/**
	 * @Description: 驳回流程 .<br>
	 * @param taskId 当前任务ID .<br>
	 * @param activityId 驳回节点ID .<br>
	 * @param variables 流程存储参数 .<br>
	 * @param reason 驳回原因 .<br>
	 * @return boolean 是否驳回成功.<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-21 上午11:23:40.<br>
	 */
	boolean backProcess(String taskId, String activityId, Map<String, Object> variables,String reason) throws TaskException;
	
	/**
	 * @Description: 根据当前任务ID，查询可以驳回的任务节点  .<br>
	 * @param @param taskId 当前任务Id.<br>
	 * @return List<ActivityImpl> 可以驳回的任务节点集合.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-20 下午5:36:14.<br>
	 */	
	List<ActivityImpl> findBackAvtivity(String taskId);
	
	/**
	 * @Description: 根据当前任务ID，查询所有活动节点  .<br>
	 * @param taskId 当前任务Id.<br>
	 * @return List<ActivityImpl> 活动节点集合.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-20 下午5:36:14.<br>
	 */
	List<ActivityImpl> findAvtivitiList(String taskId);
	
	/**
     * @Description: 转办流程  .<br>
     * @param taskId 当前任务节点ID .<br>
     * @param assignee 被转办人.<br>   
     * @param reason 原因.<br>   
     * @return boolean 是否转办成功 .<br> 
     * @author 郑成功 .<br>
	 * @throws TaskException 
     * @date 2017-9-19 下午4:06:58.<br>
     */
	boolean transferAssignee(String taskId, String assignee,String reason) throws TaskException;
	
	/**
	 * @Description: 会签 .<br>
	 * @param @param taskId 任务Id .<br>
	 * @param @param assignees 处理人信息.<br>
	 * @return boolean 是否会签成功 .<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-19 下午4:34:22.<br>
	 */
	boolean jointProcess(String taskId, List<AssigneeInfo> assignees) throws TaskException;
	
	/**
	 * @Description: 根据任务Id,终止流程 .<br>
	 * @param taskId 当前任务Id.<br>
	 * @return boolean 是否终止 .<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-19 下午4:31:48.<br>
	 */
	boolean endProcess(String taskId) throws TaskException;
	
	/**
	 * @Description: 根据流程实例Id,挂起流程 .<br>
	 * @param processInstanceId 流程实例Id .<br>
	 * @param taskId 任务Id .<br>
	 * @return boolean 是否挂起.<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-19 下午4:20:04.<br>
	 */
	boolean suspendProcessInstance(String processInstanceId,String taskId) throws TaskException;
	
	/**
	 * @Description: 根据流程实例Id,激活流程 .<br>
	 * @param processInstanceId 流程实例Id .<br>
	 * @param taskId 任务Id .<br>
	 * @return boolean 是否激活 .<br> 
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2017-9-19 下午4:19:37.<br>
	 */
	boolean activateProcessInstance(String processInstanceId,String taskId) throws TaskException;
	
	/**
	 * @Description: 通过任务Id,获取流程定义 .<br>
	 * @param @param taskId 任务Id.<br>
	 * @return TaskEntity task任务实体.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-19 下午5:20:51.<br>
	 */
	TaskEntity findTaskById(String taskId);
	
	HistoricTaskInstance findHisTaskById(String taskId);
	
	/**
	 * @Description: 通过任务Id,获取流程定义实体 .<br>
	 * @param @param taskId 任务Id.<br>
	 * @return ProcessDefinitionEntity 流程定义实体.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-19 下午5:21:25.<br>
	 */
	ProcessDefinitionEntity findProcessDefinitionEntityByTaskId(String taskId);
	
	/**
	 * @Description: 根据任务ID和节点ID获取活动节点 .<br>
	 * @param taskId 任务Id .<br>
	 * @param activityId 活动节点Id .<br>
	 * @return ActivityImpl 活动节点信息.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-20 下午5:28:00.<br>
	 */
	ActivityImpl findActivitiImpl(String taskId, String activityId);
	
	/**
	 * @Description: 根据流程实例Id和处理人，查询正在运行的任务 .<br>
	 * @param assignee 处理人 .<br>
	 * @param processInstanceId 流程实例Id .<br>
	 * @return Task 返回代办任务信息.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 上午8:30:53.<br>
	 */
	Task findUserTaskByProInst(String assignee,String processInstanceId);
	
	/**
	 * @Description: 根据流程实例Id,查询流程实例 .<br>
	 * @param processInstanceId 流程实例Id .<br>
	 * @return ProcessInstance 返回流程实例.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午5:09:50.<br>
	 */
	ProcessInstance findProcessInstance(String processInstanceId);
	
	/**
	 * @Description: 通过任务Id,获取流程实例 .<br>
	 * @param taskId 任务Id .<br>
	 * @return ProcessInstance 返回流程实例 .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 上午11:11:21.<br>
	 */
	ProcessInstance findProcessInstanceByTaskId(String taskId);
	
	/**
	 * @Description: 通过任务Id,获取流程实例 .<br>
	 * @param taskId 任务Id .<br>
	 * @return ProcessInstance 返回流程实例 .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 上午11:11:21.<br>
	 */
	HistoricProcessInstance findHisProcessInstanceByTaskId(String taskId);
	
	/**
	 * @Description: 根据流程实例ID和任务key值查询所有同级任务集合  .<br>
	 * @param processInstanceId 流程实例Id .<br>
	 * @param key 任务key值 .<br>
	 * @return List<Task> 任务集合  .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 上午11:09:31.<br>
	 */
	List<Task> findTaskListByKey(String processInstanceId, String key);
	
	/**
	 * @Description: 根据流程实例Id,查询历史流程实例集合 .<br>
	 * @param instanceId 流程实例Id.<br>
	 * @return List<HistoricActivityInstance> 返回历史流程实例集合.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午3:15:14.<br>
	 */
	List<HistoricActivityInstance> getHistoricActivityInstances(String instanceId);
	
	/**
	 * @Description: 根据处理人，查询个人历史处理处理信息 .<br>
	 * @param assignee 处理人 .<br>
	 * @return List<HistoricTaskInstance> 历史审批任务.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午3:18:08.<br>
	 */
	List<HistoricTaskInstance> getHisTaskList(String assignee);
	
	/**
	 * @Description: 根据处理人，查询当前任务的审批记录 .<br>
	 * @param assignee 处理人 .<br>
	 * @return List<HistoricTaskInstance> 历史审批任务.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午3:18:08.<br>
	 */
	List<HistoricTaskInstance> getHisTaskByTaskId(String taskId);
	
	/**
	 * @Description: 根据单据Id,获取单据的最新流程实例 .<br>
	 * @param billId 单据Id.<br>
	 * @return HistoricProcessInstance .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-28 下午4:09:13.<br>
	 */
	HistoricProcessInstance getHisProInst(String billId);
	
	/**
	 * @Description: 根据单据Id和key值，获取历史审批信息 .<br>
	 * @param billId 单据Id .<br>
	 * @param key key值 .<br>
	 * @return List<HistoricTaskInstance> 历史任务实例 .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午5:23:12.<br>
	 */
	List<HistoricTaskInstance> getHisTask(String billId, String key);
	
	/**
	 * @Description: 通过任务Id,获取批注信息 .<br>
	 * @param taskId 当前任务Id.<br>
	 * @return List<Comment> 返回审批批注.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午5:18:55.<br>
	 */
	List<Comment> findCommentByTaskId(String taskId);
	
	/**
	 * @Description: 通过单据Id和key值，获取批注信息 .<br>
	 * @param billId 单据Id .<br>
	 * @param key key值 .<br>
	 * @return List<Comment> 返回审批批注 .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午5:20:03.<br>
	 */
	List<Comment> findCommentByBillId(String billId, String key);
	
	/**
	 * @Description: 获取单列流程实例 .<br>
	 * @param instanceId 流程实例Id .<br>
	 * @return HistoricProcessInstance 返回历史流程实例 .<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午5:21:33.<br>
	 */
	HistoricProcessInstance getHistoricProcessInstance(String instanceId);
	
	/**
	 * @Description: 根据当前任务Id,获取历史审批信息及批注信息 .<br>
	 * @param taskId  当前任务Id .<br>
	 * @return List<HistoryTaskComment> 历史任务审批及批注.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-21 下午10:38:04 .<br>
	 */
	List<HistoryTaskComment> findTaskComment(String taskId);
	
	/**
	 * @Description: 获取单据审批结果 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-11-26 下午2:48:12.<br>
	 */
	List<HistoryTaskComment> findTaskCommentByBillId(String billId);
	
	/**
	 * @Description: 获取单据节点的审批人集合 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2019-3-28 上午10:28:44.<br>
	 */
	Map<String,List<HistoryTaskComment>> findTaskCommentMapByBillId(String billId);
	
	/**
	 * @Description: 获取历史审批，至当前审批节点信息 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2019-1-9 上午9:35:45.<br>
	 */
	List<HistoryTaskComment> findUniqueCommentToTask(String billId);
	
	/**
	 * @Description: 通过单据Id和key，查询单据的审批任务 .<br>
	 * @param billId 单据Id.<br>
	 * @param key 启动流程的key值.<br>
	 * @return List<HistoryTaskComment> 历史审批意见.<br> 
	 * @author 郑成功 .<br>
	 * @date 2017-9-28 下午4:20:49.<br>
	 */
	@Deprecated
	List<HistoryTaskComment> findTaskComment(String billId, String key);
	
	/**
	 * @Description: 获取唯一的历史最新批注 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-6-19 上午11:41:29.<br>
	 */
	List<HistoryTaskComment> findUniqueTaskComment(String billId);
	
	/**
	 * @Description: 跳转流程 .<br>
	 * @param taskId 任务Id.<br>
	 * @param targetTaskDefinitionKey 任务节点Key.<br>
	 * @param variables 其他参数.<br>
	 * @param reason 跳转原因.<br>
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2018-9-14 上午11:48:01.<br>
	 */
	boolean jumpTask(String taskId, String targetTaskDefinitionKey, Map<String,Object> variables,String reason) throws TaskException;
	
	/**
	 * @Description: 根据任务Id,获取流程图 .<br>
	 * @param taskOrProInstId 根据任务或者流程实例Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:46:15.<br>
	 */
	InputStream getFlowChart(String taskOrProInstId);
	
	/**
	 * @Description: 根据任务或者流程实例Id，获取流程图 .<br>
	 * @param taskOrProInstId
	 * @return .<br>   
	 * @author 郑成功 .<br>
	 * @date 2018-8-6 下午8:16:15.<br>
	 */
	InputStream getCustomFlowChart(String taskOrProInstId);
	
	/**
	 * @Description: 获取单据流程图 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-6 下午8:51:21.<br>
	 */
	InputStream getBillCustomFlowChart(String billId);
	
	/**
	 * @Description: 根据流程单据Id,获取流程图 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:47:40.<br>
	 */
	InputStream getFlowChartBillId(String billId);
	
	/**
	 * @Description: 根据流程实例Id,获取流程图 .<br>
	 * @param processInstanceId 流程实例Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:47:40.<br>
	 */
	InputStream getFlowChartByProInstId(String processInstanceId);
	
	/**
	 * @Description: 根据任务Id,跳转至任务节点 .<br>
	 * @param taskId 任务Id.<br>
	 * @return List<HistoryTaskComment> 活动节点.<br> 
	 * @author 郑成功 .<br>
	 * @date 2018-3-20 下午4:20:49.<br>
	 */
	List<?> findActDefKeyList(String taskId);
	
	//签收任务
	boolean claimTask(String taskId,String claimer) throws TaskException;
	
	/**
	 * @Description: 根据模型Id,获取模型的用户任务节点 .<br>
	 * @param modelId 模型Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-18 下午11:20:12.<br>
	 */
	List<UserTask> findUserTasks(String modelId);
	
	/**
	 * @Description: 根据单据Id,获取流程最新一条任务审批记录 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-18 下午11:18:45.<br>
	 */
	List<HistoricTaskInstanceEntity> findUniqueHisTasks(String billId);
	
	/**
	 * @Description: 获取至当前任务的历史唯一最新审批记录 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-25 下午11:17:19.<br>
	 */
	List<HistoricTaskInstanceEntity> findUniqueHisTasksToRunTask(String billId);
	
	/**
	 * @Description: 根据流程定义Id,获取流程模型 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-19 下午9:53:26.<br>
	 */
	BpmnModel findModel(String billId);
	
	/**
	 * @Description: 获取模型里面的用户任务 .<br>
	 * @param model 模型 .<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-19 下午10:02:23.<br>
	 */
	List<UserTask> findUserTaskByModel(BpmnModel model);
	
	/**
	 * @Description: 根据单据Id,获取正在运行的任务集合 .<br>
	 * @param billId 单据Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-5-21 上午11:50:32.<br>
	 */
	List<TaskEntity> findTaskList(String billId);
	
	/**
	 * @Description: 完成当前任务，得到下一步任务处理人 .<br>
	 * @param taskId 任务Id.<br>
	 * @param operate 操作.<br>
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2018-5-23 上午10:49:34.<br>
	 */
	boolean complate(String taskId,OperateBean operate) throws TaskException;
	
	/**
	 * @Description: 获取指定人的代办任务 .<br>
	 * @param assignee 处理人.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-4 上午11:13:31.<br>
	 */
	List<Task> findMyTasks(String assignee);
	
	/**
	 * @Description: 保存用户-组 .<br>
	 * @param groupId 组Id.<br>
	 * @param userIds 用户集合 .<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-20 上午11:11:30.<br>
	 */
	boolean saveUserGroup(String groupId,List<String> userIds);
	
	/**
	 * @Description: 删除用户-组 .<br>
	 * @param groupId 组Id.<br>
	 * @param userIds 用户集合 .<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-20 上午11:11:30.<br>
	 */
	boolean deleteGroupUser(String groupId,List<String> userIds);
	
	/**
	 * @Description: 获取用户任务扩展属性 .<br>
	 * @param userTask 用户任务实体类.<br>
	 * @param propertyName 属性名.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-24 下午5:22:49.<br>
	 */
	CustomProperty getCustomProperty(UserTask userTask,String propertyName);
	
	/**
	 * @Description: 根据任务Id,获取短信模板 .<br>
	 * @param taskId 任务Id.<br>
	 * @param 流程节点的Key.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:59:49.<br>
	 */
	UserTask getUserTaskByTaskId(String taskId,String taskDefKey);
	
	/**
	 * @Description: 根据流程定义Id,获取短信模板 .<br>
	 * @param preDefId 流程定义Id.<br>
	 * @param 流程节点的Key.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:59:49.<br>
	 */
	UserTask getUserTaskByPreDefId(String preDefId,String taskDefKey);
	
	/**
	 * @Description: 根据流程实例Id,获取短信模板 .<br>
	 * @param proInstId 流程实例Id.<br>
	 * @param 流程节点的Key.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:59:49.<br>
	 */
	UserTask getUserTaskByProInstId(String proInstId,String taskDefKey);
	
	/**
	 * @Description: 根据模型Id,获取短信模板 .<br>
	 * @param modelId 模型Id.<br>
	 * @param 流程节点的Key.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 上午10:59:49.<br>
	 */
	UserTask getUserTaskByModelId(String modelId,String taskDefKey);
	
	/**
	 * @Description: 获取启动流程的用户Id .<br>
	 * @param taskId 任务Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 下午1:47:30.<br>
	 */
	String getStartActUserIdByTask(String taskId);
	
	/**
	 * @Description: 获取启动流程的用户Id  .<br>
	 * @param proInstId 流程实例Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 下午1:48:02.<br>
	 */
	String getStartActUserIdByProInst(String proInstId);
	
	/**
	 * @Description: 获取单据信息 .<br>
	 * @param billBean 单据传入实体.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-7-25 下午5:38:25.<br>
	 */
	Map<String,Object> getBillInfo(BillBean billBean);
	
	/**
	 * @Description: 修改单据状态 .<br>
	 * @param status 状态值 .<br>
	 * @param billBean 单据信息.<br>   
	 * @author 郑成功 .<br>
	 * @date 2017-12-19 上午8:53:23.<br>
	 */
	boolean updateBillStatus(int status,BillBean billBean);
	
	/**
	 * @Description: 获取正在运行的任务 .<br>
	 * @param taskId 任务Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午10:31:49.<br>
	 */
	Task getTask(String taskId);
	
	/**
	 * @Description: 获取运行中的单据配置信息 .<br>
	 * @return executionId 执行Id.<br>   
	 * @author 郑成功 .<br>
	 * @date 2018-8-28 上午10:32:10.<br>
	 */
	BillBean getBillBean(String executionId);
	
	/**
	 * @Description: 单据Id,获取任务历史流程，按创建时间排序 .<br>
	 * @param billId 单据Id.<br>   
	 * @author 郑成功 .<br>
	 * @date 2018-11-26 下午1:49:27.<br>
	 */
	List<HistoricTaskInstanceEntity> findHisTask(String billId);
	
	/**
	 * @Description: 催办任务 .<br>
	 * @param proInstId 流程实例Id.<br>
	 * @param msg 催办消息的内容.<br>
	 * @author 郑成功 .<br>
	 * @throws TaskException 
	 * @date 2018-12-6 下午1:39:43.<br>
	 */
	boolean reminderTask(String proInstId,String msg) throws TaskException;

	/**
	 * @Description: 回调流程处理 .<br>
	 * @param billBean 单据信息.<br>
	 * @param type 处理类型,对应cn.jjxx.modules.activiti.config.Contacts中的类型.<br>
	 * @param billId 单据Id.<br>
	 * @throws TaskException 异常.<br>   
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午2:18:06.<br>
	 */
	void callFlowClass(BillBean billBean, String type, String billId) throws TaskException;

	/**
	 * @Description: 更新单据信息 .<br>
	 * @param task 任务Id.<br>
	 * @param billBean 单据信息类.<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午2:19:54.<br>
	 */
	AjaxJson updateBill(Task task, BillBean billBean);

	/**
	 * @Description: 发送短信 .<br>
	 * @param billId 单据Id.<br>   
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午2:20:33.<br>
	 */
	void sendSms(String billId);
	
	/**
	 * @Description: 通过任务Id,获取流程单据配置信息 .<br>
	 * @param taskId .<br>
	 * @author 郑成功 .<br>
	 * @date 2018-12-6 下午4:07:37.<br>
	 */
	BillBean getBillBeanByTaskId(String taskId);
	
	/**
	 * @Description: 获取流程指向的下一步连线 .<br>
	 * @param taskId 任务Id.<br>
	 * @return 返回所有线路.<br>   
	 * @author 郑成功 .<br>
	 * @date 2019-1-8 下午3:19:04.<br>
	 */
	List<PvmTransition> getNextBranches(String taskId);
	
	/**
	 * @Description: 检测是否允许执行打回操作 .<br>
	 * @param taskId 任务Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2019-1-8 下午3:27:05.<br>
	 */
	boolean isAllowHitback(String taskId);

	/**
	 * @Description: 获取正在运行的变量参数 .<br>
	 * @param executionId 流程执行Id.<br>
	 * @author 郑成功 .<br>
	 * @date 2019-1-9 下午2:11:32.<br>
	 */
	Map<String, Object> getRuVariables(String executionId);

	
	
}
